#include "comm.hpp"

int main()
{
    // 获取key
    int key = ftok(pathname, proj_id);
    if (key < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }
    sleep(2);

    // 创建共享内存
    int shmid = shmget(key, size, IPC_CREAT | IPC_EXCL | 0644);
    if (shmid < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }
    cout << "创建共享内存，shmid:" << shmid << endl;
    sleep(2);

    // 共享内存挂接
    char *s = (char *)shmat(shmid, nullptr, 0);
    if (s < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }
    cout << "共享内存挂接" << endl;
    sleep(2);

    int piperet = mkfifo("fifo", 0644);
    if (piperet < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }
    int fd = open("fifo", O_WRONLY);
    if (fd < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }

    int msg = 2;

    // 这里开始进行信息的传递
    for (int i = 0; i < 3; i++)
    {
        write(fd, &msg, sizeof(msg));
        s[i] = 'a' + i;
        cout << "写入" << (char)('a' + i) << endl;
        sleep(3);
    }

    close(fd);

    // 共享内存解链接
    int dt = shmdt(s);
    if (dt < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }
    cout << "共享内存解链接" << endl;
    sleep(10);

    // 共享内存释放
    int ret = shmctl(shmid, IPC_RMID, nullptr);
    if (ret < 0)
    {
        cout << "errno: " << errno << " error: " << strerror(errno) << endl;
        return 1;
    }
    cout << "共享内存释放" << endl;

    return 0;
}